﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Biciq.Datos;
using System.Configuration;

namespace Biciq.Logica
{
    /// <summary>
    /// Servicios para ser consumidos desde el dispositivo móbil
    /// </summary>
    public class MobileServicios
    {

        private static MobileServicios _instance;
        public static MobileServicios Instance
        {
            get
            {
                if (_instance == null)
                    _instance = new MobileServicios();
                return MobileServicios._instance;
            }

        }

        public Empleado ConsultarEmpleadoPorId(Guid IdEmpleado)
        {
            using (BiciqContexto contexto = new BiciqContexto())
            {
                return contexto.Empleadoes.Where(e => e.id == IdEmpleado).FirstOrDefault();
            }
        }

        public Cliente ConsultarClientePorId(Guid IdCliente)
        {
            using (BiciqContexto contexto = new BiciqContexto())
            {
                return contexto.Clientes.Where(e => e.Id == IdCliente).FirstOrDefault();
            }
        }

        public Estacion ConsultarEstacionPorId(Guid IsEstacion)
        {
            using (BiciqContexto contexto = new BiciqContexto())
            {
                return contexto.Estacions.Where(e => e.Id == IsEstacion).FirstOrDefault();
            }
        }
        /// <summary>
        /// Servicio para ingresar a operar estación
        /// </summary>
        /// <param name="codigoUsuario">Codigo de la tarjeta del operador</param>
        /// <param name="numeroEstacion">Estación correspondiente</param>
        /// <returns></returns>
        public Result Ingresar(string codigoUsuario, int  numeroEstacion)
        {
            Result resultado = new Result();
            resultado.mensaje = "Ok";
            resultado.estado = true;
            using (BiciqContexto contexto = new BiciqContexto())
            {
               
                var empleado = contexto.Empleadoes
                    .Include("Usuario")
                    .Where(e => e.Codigo == codigoUsuario && e.estado == "ACT" && e.Usuario.estado == "ACT"
                       
                        
                    ).FirstOrDefault();


                var estacion = contexto.Estacions
                          .Include("EstacionBiciletas")
                       .Where(e => e.Numero == numeroEstacion && e.Estado == "ACT").FirstOrDefault();
                if (estacion == null)
                {
                    resultado = null;
                    return resultado;
                }

                if (empleado != null)
                {
                    //var sesionesActivas = contexto.AccesoEstacions.Where(a => a.Usuario.id == empleado.usuario_id && a.FechaSalida == null && a.IdEstacion!= estacion.Id ).Count();


                    //if (sesionesActivas > 0)
                    //{
                    //    resultado = null;
                    //    return resultado;
                    //}

                    //sesionesActivas = contexto.AccesoEstacions.Where(a => a.Estacion.Numero == numeroEstacion && a.FechaSalida == null && a.Usuario.id != empleado.usuario_id).Count();
                    //if (sesionesActivas > 0)
                    //{
                    //    resultado = null;
                    //    return resultado;
                    //}

                    AccesoEstacion acceso = new AccesoEstacion();
                    acceso.IdEstacion = estacion.Id;
                    acceso.IdUsuario = empleado.Usuario.id;
                    acceso.FechaEntrada = DateTime.Now;
                    acceso.Observaciones = "Ingreso desde estación " + estacion.Nombre;
                    acceso.Id = Guid.NewGuid();
                    contexto.AccesoEstacions.AddObject(acceso);

                    contexto.SaveChanges();


                    resultado.Objeto1 = empleado;
                    resultado.Objeto2 = estacion;
                    resultado.Objeto3 = estacion.EstacionBiciletas.Where(eb=>eb.Estacion.Numero.Value==numeroEstacion).Count();

                }

                else
                {
                    resultado= null;
                }
            }
            return resultado;
        }
        /// <summary>
        /// Servicio para iniciar Operacion en el dispositivo mobil
        /// </summary>
        /// <param name="IdUsuario">Identificador unico de operador de estación</param>
        /// <param name="IdEstacion">Identificador unico de la Estación</param>
        /// <param name="bicicletas">Bicicletas incio Operación</param>
        /// <param name="observaciones">Detalles del Operador</param>
        /// <returns></returns>
        public Result IniciarOperacion(Guid IdUsuario, Guid IdEstacion, List<string> bicicletas, string observaciones)
       {
           Result resultado = new Result();
           resultado.estado = true;
           resultado.mensaje = "Ok";

          try 
	        {	        
		 using (BiciqContexto contexto = new BiciqContexto())
           {
            

              

               Operacion operacion = new Operacion();
               operacion.Id = Guid.NewGuid();
               operacion.Estado = "ACT";
               operacion.Fecha = DateTime.Now;
               operacion.IdEstacion = IdEstacion;
               operacion.IdUsuario = IdUsuario;
               operacion.Observaciones = observaciones;
               operacion.IdTipoOperacion = Guid.Parse("3bbb6bdf-78df-4311-8561-a83e943ef6a8");


           var  numeroBiciclestasActual = contexto.EstacionBiciletas.Where(eb=>eb.IdEstacion == IdEstacion).Count();
                if (numeroBiciclestasActual != bicicletas.Count)
               {
                   operacion.Observaciones = operacion.Observaciones + ". El Sistema detecta que hay un número diferente de bicicletas que en el día anterior. Ayer: " + numeroBiciclestasActual + " Hoy: "  + bicicletas.Count ;
                    //TODO 
                    //Enviar Correo de notificación de diferencias.
                   var emailSupervisor = new AppSettingsReader().GetValue("MailSupervisor", observaciones.GetType()).ToString();

                   Comun.enviarCorreo(emailSupervisor, "Diferencia en Inicio de Operación", operacion.Observaciones);

               }

                foreach (var item in contexto.EstacionBiciletas.Where(e=>e.IdEstacion == IdEstacion))
                {
                    contexto.DeleteObject(item);
                }

               foreach (var item in bicicletas)
               {
                   int numero=  Convert.ToInt32(item);
                   var bicicleta = contexto.Bicicletas.Where(b => b.Numero == numero).FirstOrDefault();
                   
                     if (bicicleta == null)
                     {
                         resultado.estado = false;
                         resultado.mensaje = "Existe un problema al leer el código de la Bicileta, intente nuevamente";
                         return resultado;

                        
                         }

                       DetalleOperacion detalle = new DetalleOperacion();
                       detalle.Id = Guid.NewGuid();
                       detalle.IdBicicleta = bicicleta.Id;
                       operacion.DetalleOperacions.Add(detalle);

                       EstacionBicileta estacionBicicleta = new EstacionBicileta();
                       
                       estacionBicicleta.Id = Guid.NewGuid();
                       estacionBicicleta.idBicicleta = bicicleta.Id;
                       estacionBicicleta.IdEstacion = IdEstacion;
                       
                       contexto.EstacionBiciletas.AddObject(estacionBicicleta);

                       foreach (var bic in contexto.ClienteBicicletas.Where(b => b.Bicicleta.Id == bicicleta.Id))
                       {


                           try
                           {

                               var operacionPres = contexto.Operacions.Where(o => o.IdTipoOperacion.Value == Guid.Parse("1c6f54a2-ab24-45aa-bd1c-55e06f26f05e")
                                                                    && o.Estado == "ACT"
                                                                    );
                               foreach (var prestamo in operacionPres)
                               {

                                   Operacion operacionDev = new Operacion();
                                   operacionDev.Id = Guid.NewGuid();
                                   operacionDev.Estado = "COM";
                                   operacionDev.Fecha = DateTime.Now;
                                   operacionDev.IdEstacion = IdEstacion;
                                   operacionDev.IdUsuario = IdUsuario;
                                   operacionDev.Observaciones = "";
                                   operacionDev.IdTipoOperacion = Guid.Parse("1d13c26b-6185-4656-8bda-a55cfc2ea1d0");

                                   operacionDev.IdOperacionFinaliza = prestamo.Id;

                                   prestamo.Estado = "COM";

                                   contexto.Operacions.AddObject(operacionDev);

                                   var historiaCliente = contexto.HistoriaClientes.Where(h => h.IdOperacionPrestamo == prestamo.Id).FirstOrDefault();
                                   var historiaBicileta = contexto.HistoriaBicilietas.Where(h => h.IdOperacionPrestamo == prestamo.Id).FirstOrDefault();

                                   historiaBicileta.IdOperacionEntrega = operacionDev.Id;
                                   historiaBicileta.IdEstacionEntrega = IdEstacion;
                                   historiaBicileta.HoraEntrega = new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);


                                   historiaCliente.IdEstacionEntrega = IdEstacion;
                                   historiaCliente.IdOperacionEntrega = operacionDev.Id;
                                   historiaCliente.MinutosRecorrido = 40;
                                   historiaCliente.MinutosRetraso = 0;

                               }
                           }
                           catch (Exception)
                           {
                               
                               
                           }

                                contexto.ClienteBicicletas.DeleteObject(bic); 
                       } 

                       
               }

               contexto.Operacions.AddObject(operacion);





               contexto.SaveChanges();
               resultado.mensaje = "Se ha registrado el Inicio de día conrrectamente con " + bicicletas.Count.ToString() + " registradas";
               resultado.Objeto1 = contexto.EstacionBiciletas.Where(eb=>eb.IdEstacion==IdEstacion).Count();


               var parametrosSancion = contexto.ParametrosSanciones.FirstOrDefault();
               if (contexto.EstacionBiciletas.Count() <= parametrosSancion.MinimoBicicletas.Value + parametrosSancion.AdvertenciaBicicletas.Value)
               {
                   var emailSupervisor = new AppSettingsReader().GetValue("MailSupervisor", observaciones.GetType()).ToString();

                   Comun.enviarCorreo(emailSupervisor, "Estación con Número mínimo de Bicicletas", "La estación " + contexto.Estacions.Where(e => e.Id == IdEstacion).FirstOrDefault().Nombre + "está llegando al numero Mínimo de biciletas, número actual de bicicletas: " + contexto.EstacionBiciletas.Count());

               }

               if (contexto.EstacionBiciletas.Count() >= parametrosSancion.MaximoBiciletas.Value - parametrosSancion.AdvertenciaBicicletas.Value)
               {
                   var emailSupervisor = new AppSettingsReader().GetValue("MailSupervisor", observaciones.GetType()).ToString();

                   Comun.enviarCorreo(emailSupervisor, "Estación con Número máximo de Bicicletas", "La estación " + contexto.Estacions.Where(e => e.Id == IdEstacion).FirstOrDefault().Nombre + "está llegando al numero Máximo de biciletas, número actual de bicicletas: " + contexto.EstacionBiciletas.Count());

               }
           }

	        }
	        catch (Exception)
	        {
		
		        resultado.estado=false;
                resultado.mensaje = "Un error a ocurrido al Inicializar Operación";
	        }
             return resultado;
       }
        /// <summary>
        /// Operación del Prestamo de Bicicletas.
        /// </summary>
        /// <param name="IdUsuario">Identificador unico del Operador</param>
        /// <param name="IdEstacion">Identificador Unico de Estación</param>
        /// <param name="CodigoBicicleta">Numero de Bicicleta</param>
        /// <param name="codigoCliente">Codigo del ususario</param>
        /// <returns></returns>
        public Result PrestamoBicileta(Guid IdUsuario, Guid IdEstacion, string CodigoBicicleta, string codigoCliente)
        {
            Result resultado = new Result();
            resultado.mensaje = "Ok";
            resultado.estado = true;

            using (BiciqContexto contexto = new BiciqContexto())
            {

                int numero = Convert.ToInt32(CodigoBicicleta);
                var bicicleta = contexto.Bicicletas.Where(b => b.Numero == numero).FirstOrDefault();
                   
                if (bicicleta == null)
                {
                    resultado.estado = false;
                    resultado.mensaje = "Existe un problema al leer el código de la Bicileta, intente nuevamente";
                    return resultado;
                }
                
                var cliente = contexto.Clientes
                    .Include("ClienteBicicletas")
                    .Where(b => b.Tarjeta.codigo == codigoCliente).FirstOrDefault();
                
                if (cliente == null)
                {
                    resultado.estado = false;
                    resultado.mensaje = "Existe un problema al leer el código del Cliente, intente nuevamente";
                    return resultado;
                }

                if (cliente.Estado == "Caducado")
                {
                    resultado.estado = false;
                    resultado.mensaje = "La suscripción del cliente ha caducado, acerquese a las oficinas a renovar su suscripción.";
                    return resultado;
                }
                ////var historiacliente = contexto.HistoriaClientes.Where(h => h.IdCliente.Value == IdUsuario && DateTime.Now.Subtract(h.Fecha.Value.AddMinutes(h.MinutosRecorrido.Value)).TotalMinutes <= 10);
                ////if (historiacliente != null)
                ////{
                ////    resultado.estado = false;
                ////    resultado.mensaje = "Debe esperar al menos 10 minutos desde el último uso realizado." ;
                ////    return resultado;
                ////}

                foreach (var bic in contexto.ClienteBicicletas.Where(b => b.Bicicleta.Id == bicicleta.Id))
                {


                    try
                    {

                        var operacionPres = contexto.Operacions.Where(o => o.IdTipoOperacion.Value == Guid.Parse("1c6f54a2-ab24-45aa-bd1c-55e06f26f05e")
                                                             && o.Estado == "ACT"
                                                             );
                        foreach (var prestamo in operacionPres)
                        {

                            Operacion operacionDev = new Operacion();
                            operacionDev.Id = Guid.NewGuid();
                            operacionDev.Estado = "COM";
                            operacionDev.Fecha = prestamo.Fecha.Value.AddMinutes(40);
                            operacionDev.IdEstacion = IdEstacion;
                            operacionDev.IdUsuario = IdUsuario;
                            operacionDev.Observaciones = "";
                            operacionDev.IdTipoOperacion = Guid.Parse("1d13c26b-6185-4656-8bda-a55cfc2ea1d0");

                            operacionDev.IdOperacionFinaliza = prestamo.Id;

                            prestamo.Estado = "COM";

                            contexto.Operacions.AddObject(operacionDev);

                            var historiaClienteP = contexto.HistoriaClientes.Where(h => h.IdOperacionPrestamo == prestamo.Id).FirstOrDefault();
                            var historiaBiciletaP = contexto.HistoriaBicilietas.Where(h => h.IdOperacionPrestamo == prestamo.Id).FirstOrDefault();

                            if (historiaClienteP != null)
                            {
                                historiaBiciletaP.IdOperacionEntrega = operacionDev.Id;
                                historiaBiciletaP.IdEstacionEntrega = IdEstacion;
                                historiaBiciletaP.HoraEntrega = new TimeSpan(operacionDev.Fecha.Value.Hour, operacionDev.Fecha.Value.Minute, operacionDev.Fecha.Value.Second);
                            }

                            if (historiaBiciletaP != null)
                            {
                                historiaClienteP.IdEstacionEntrega = IdEstacion;
                                historiaClienteP.IdOperacionEntrega = operacionDev.Id;
                                historiaClienteP.MinutosRecorrido = 40;
                                historiaClienteP.MinutosRetraso = 0;
                                historiaClienteP.HoraEntrega = new TimeSpan(operacionDev.Fecha.Value.Hour, operacionDev.Fecha.Value.Minute, operacionDev.Fecha.Value.Second);
                            }

                        }
                    }
                    catch (Exception)
                    {


                    }

                    contexto.ClienteBicicletas.DeleteObject(bic);
                } 

                Operacion operacion = new Operacion();
                operacion.Id = Guid.NewGuid();
                operacion.Estado = "ACT";
                operacion.Fecha = DateTime.Now;
                operacion.IdEstacion = IdEstacion;
                operacion.IdUsuario = IdUsuario;
                operacion.Observaciones = "";
                operacion.IdTipoOperacion = Guid.Parse("1c6f54a2-ab24-45aa-bd1c-55e06f26f05e");
                operacion.IdCliente = cliente.Id;

                DetalleOperacion detalle = new DetalleOperacion();
                detalle.Id = Guid.NewGuid();
                detalle.IdBicicleta = bicicleta.Id;
                operacion.DetalleOperacions.Add(detalle);


                contexto.Operacions.AddObject(operacion);

                //var EstacionBicleta = contexto.EstacionBiciletas.Where(e => e.idBicicleta == bicicleta.Id && e.IdEstacion == IdEstacion).FirstOrDefault();

                //if (EstacionBicleta == null)
                //{
                //    //resultado.estado = false;
                //    //resultado.mensaje = "La bicileta no se encuentra ingresada en la estación, revise los datos e intente nuevamente";

                //    //return resultado;
                //}
                //else
                //{
                //    contexto.DeleteObject(EstacionBicleta);
                //}

                foreach (var item in contexto.EstacionBiciletas.Where(e => e.idBicicleta == bicicleta.Id && e.IdEstacion == IdEstacion))
                {
                    contexto.DeleteObject(item);
                }
                ClienteBicicleta clienteBicileta = new ClienteBicicleta();
                clienteBicileta.Id = Guid .NewGuid();
                clienteBicileta.IdCliente = cliente.Id;
                clienteBicileta.IdBicicleta = bicicleta.Id;

                contexto.ClienteBicicletas.AddObject(clienteBicileta);

            
                
                HistoriaCliente historiaCliente = new HistoriaCliente();
                historiaCliente.Estado = "ACT";
                historiaCliente.Fecha = DateTime.Now;
                historiaCliente.HoraPrestamo = new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);
                historiaCliente.Id = Guid.NewGuid();
                historiaCliente.IdCliente = cliente.Id;
                historiaCliente.IdEstacionPrestamo = IdEstacion;
                historiaCliente.IdOperacionPrestamo = operacion.Id;

                contexto.HistoriaClientes.AddObject(historiaCliente);

                HistoriaBicilieta historiaBicicleta = new HistoriaBicilieta();
                historiaBicicleta.Fecha = DateTime.Now;
                historiaBicicleta.HoraPrestamo = historiaCliente.HoraPrestamo;
                historiaBicicleta.Id = Guid.NewGuid();
                historiaBicicleta.IdBicileta = bicicleta.Id;
                historiaBicicleta.IdCliente = cliente.Id;
                historiaBicicleta.IdEstacionPrestamo = IdEstacion;
                historiaBicicleta.IdOperacionPrestamo = operacion.Id;

                contexto.HistoriaBicilietas.AddObject(historiaBicicleta);

                contexto.SaveChanges();
                resultado.Objeto1 = contexto.EstacionBiciletas.Where(e=>e.Id==IdEstacion).Count();
                resultado.Objeto2 = cliente;


                var parametrosSancion = contexto.ParametrosSanciones.FirstOrDefault();
                if (contexto.EstacionBiciletas.Count() <= parametrosSancion.MinimoBicicletas.Value + parametrosSancion.AdvertenciaBicicletas.Value)
                {
                    var emailSupervisor = new AppSettingsReader().GetValue("MailSupervisor", CodigoBicicleta.GetType()).ToString();

                    Comun.enviarCorreo(emailSupervisor, "Estación con Número mínimo de Bicicletas", "La estación " + contexto.Estacions.Where(e => e.Id == IdEstacion).FirstOrDefault().Nombre + "está llegando al numero Mínimo de biciletas, número actual de bicicletas: " + contexto.EstacionBiciletas.Count());
                     
                }
                 
                if (contexto.EstacionBiciletas.Count() >= parametrosSancion.MaximoBiciletas.Value - parametrosSancion.AdvertenciaBicicletas.Value)
                {
                    var emailSupervisor = new AppSettingsReader().GetValue("MailSupervisor", CodigoBicicleta.GetType()).ToString();

                    Comun.enviarCorreo(emailSupervisor, "Estación con Número máximo de Bicicletas", "La estación " + contexto.Estacions.Where(e => e.Id == IdEstacion).FirstOrDefault().Nombre + "está llegando al numero Máximo de biciletas, número actual de bicicletas: " + contexto.EstacionBiciletas.Count());

                }
            }
            return resultado;

        }
        /// <summary>
        /// Proceso de devolución de bicicleta del aplicativo mobil
        /// </summary>
        /// <param name="IdUsuario">Id usuario estación</param>
        /// <param name="IdEstacion">Id estacion devolución</param>
        /// <param name="CodigoBicicleta">Verificación codigo bicicleta</param>
        /// <param name="codigoCliente">Verificacion codigo cliente</param>
        /// <returns></returns>
        public Result DevolucionBicileta(Guid IdUsuario, Guid IdEstacion, string CodigoBicicleta, string codigoCliente)
        {
            Result resultado = new Result();
            resultado.mensaje = "Ok";
            resultado.estado = true;

            using (BiciqContexto contexto = new BiciqContexto())
            {

                int numero = Convert.ToInt32(CodigoBicicleta);
                var bicicleta = contexto.Bicicletas.Where(b => b.Numero == numero).FirstOrDefault();

                if (bicicleta == null)
                {
                    resultado.estado = false;
                    resultado.mensaje = "Existe un problema al leer el código de la Bicileta, intente nuevamente";
                    return resultado;
                }

                var cliente = contexto.Clientes.Where(b => b.Tarjeta.codigo == codigoCliente).FirstOrDefault();
                if (cliente == null)
                {
                    resultado.estado = false;
                    resultado.mensaje = "Existe un problema al leer el código del Cliente, intente nuevamente";
                    return resultado;
                }

                var clientebicicleta = contexto.ClienteBicicletas.Where(cb => cb.IdCliente == cliente.Id && cb.IdBicicleta == bicicleta.Id).FirstOrDefault();

                if (clientebicicleta == null)
                {
                    resultado.estado = false;
                    resultado.mensaje = " La bicicleta ingresada no está prestada al cliente " + cliente.NombresApellidos + " , verifique los datos por favor ";
                    return resultado;
                }
                Operacion operacion = new Operacion();
                operacion.Id = Guid.NewGuid();
                operacion.Estado = "COM";
                operacion.Fecha = DateTime.Now;
                operacion.IdEstacion = IdEstacion;
                operacion.IdUsuario = IdUsuario;
                operacion.Observaciones = "";
                operacion.IdTipoOperacion = Guid.Parse("1d13c26b-6185-4656-8bda-a55cfc2ea1d0");
                operacion.IdCliente = cliente.Id;

                DetalleOperacion detalle = new DetalleOperacion();
                detalle.Id = Guid.NewGuid();
                detalle.IdBicicleta = bicicleta.Id;
                operacion.DetalleOperacions.Add(detalle);

                contexto.Operacions.AddObject(operacion);

                var ClienteBicileta = contexto.ClienteBicicletas.Where(e => e.IdBicicleta == bicicleta.Id && e.IdCliente.Value == cliente.Id).FirstOrDefault();
                if (ClienteBicileta == null)
                {
                    //resultado.estado = false;
                    //resultado.mensaje = "La bicileta no se encuentra registrada con el cliente revise los datos e intente nuevamente, en caso de persistir el problema comuníquese con su administrador";

                    //return resultado;
                }
                else
                {

                    contexto.DeleteObject(ClienteBicileta);
                }
                EstacionBicileta estacionBicicleta = new EstacionBicileta();
                estacionBicicleta.Id = Guid.NewGuid();
                estacionBicicleta.idBicicleta = bicicleta.Id;
                estacionBicicleta.IdEstacion = IdEstacion;

                contexto.EstacionBiciletas.AddObject(estacionBicicleta);
                Guid IdtipoOperacion = Guid.Parse( "1c6f54a2-ab24-45aa-bd1c-55e06f26f05e");

                var operacionPrestamo = contexto.Operacions.Where(o => o.IdCliente.Value == cliente.Id && o.IdTipoOperacion.Value == IdtipoOperacion && o.Estado == "ACT").OrderByDescending(o=>o.Fecha.Value).FirstOrDefault();
                
                var historiaCliente = contexto.HistoriaClientes.Where(h=>h.IdOperacionPrestamo==operacionPrestamo.Id).FirstOrDefault();
                var historiaBicileta = contexto.HistoriaBicilietas.Where(h=>h.IdOperacionPrestamo==operacionPrestamo.Id).FirstOrDefault();



         
                var parametrosSancion = contexto.ParametrosSanciones.FirstOrDefault();
                var tiempoParametro = parametrosSancion.TiempoRecorrido;

                var tiempoRecorrido = DateTime.Now.Subtract( operacionPrestamo.Fecha.Value).Minutes;

                int minutosRetraso = 0;
                if (tiempoRecorrido > tiempoParametro )
                {
                    minutosRetraso = tiempoRecorrido - tiempoParametro.Value;
                    if (minutosRetraso > parametrosSancion.TiempoLimite)
                    {
                        var numeroRetrasos = contexto.HistoriaClientes.Where(h => h.MinutosRetraso > parametrosSancion.TiempoLimite).Count();
                        switch (numeroRetrasos +1)
                        {
                            
                            case 1:
                                historiaCliente.TiempoSancion = parametrosSancion.TiempoPrimeraVez;
                                historiaCliente.TipoTiempoSancion = parametrosSancion.TipoPrimeraVez;
                                break;
                            case 2:
                                 historiaCliente.TiempoSancion = parametrosSancion.TiempoSegundaVez;
                                historiaCliente.TipoTiempoSancion = parametrosSancion.TipoSegundavez;
                                break;
                            case 3:
                                historiaCliente.TiempoSancion = parametrosSancion.TiempoTercerVez;
                                historiaCliente.TipoTiempoSancion = parametrosSancion.TipoTerceraVez;
                                break;

                            case 4:
                                 historiaCliente.TiempoSancion = parametrosSancion.TiempoCuartaVez;
                                historiaCliente.TipoTiempoSancion = parametrosSancion.TipoCuartaVez;
                                break;
                        }

                    }

                }



                historiaBicileta.IdOperacionEntrega = operacion.Id;
                historiaBicileta.IdEstacionEntrega = IdEstacion;
                historiaBicileta.HoraEntrega = new TimeSpan(DateTime.Now.Hour,DateTime.Now.Minute, DateTime.Now.Second);
                

                historiaCliente.IdEstacionEntrega = IdEstacion;
                historiaCliente.IdOperacionEntrega = operacion.Id;
                historiaCliente.MinutosRecorrido = tiempoRecorrido;
                historiaCliente.MinutosRetraso = minutosRetraso;
                historiaCliente.HoraEntrega = new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);

                StringBuilder mensaje = new StringBuilder();
                mensaje.Append("Hora de Salida: " +operacionPrestamo.Fecha.Value.ToString("hh:mm"));
                mensaje.AppendLine();
                mensaje.Append("Hora de Entrada: " + DateTime.Now.ToString("hh:mm"));
                mensaje.AppendLine();
                mensaje.Append("Tiempo Total de Recorrido: " + tiempoRecorrido.ToString());
                mensaje.AppendLine();
                mensaje.Append("Minutos de retraso: " + minutosRetraso.ToString());
                mensaje.AppendLine();
                if (minutosRetraso > parametrosSancion.TiempoLimite)
                {
                    mensaje.Append("Sanción: " + historiaCliente.TiempoSancion.ToString() + " " + historiaCliente.TipoTiempoSancion );
                    mensaje.AppendLine();
                }



                if (operacionPrestamo != null)
                {
                    operacionPrestamo.Estado = "COM";
                    operacionPrestamo.IdOperacionFinaliza = operacion.Id;
                }

                contexto.SaveChanges();

                resultado.mensaje = mensaje.ToString();
                resultado.Objeto1 = contexto.EstacionBiciletas.Where(e => e.Id == IdEstacion).Count();
                resultado.Objeto2 = cliente;


                
                if (contexto.EstacionBiciletas.Count() <= parametrosSancion.MinimoBicicletas.Value + parametrosSancion.AdvertenciaBicicletas.Value)
                {
                    var emailSupervisor = new AppSettingsReader().GetValue("MailSupervisor", CodigoBicicleta.GetType()).ToString();

                    Comun.enviarCorreo(emailSupervisor, "Estación con Número mínimo de Bicicletas", "La estación " + contexto.Estacions.Where(e => e.Id == IdEstacion).FirstOrDefault().Nombre + "está llegando al numero Mínimo de biciletas, número actual de bicicletas: " + contexto.EstacionBiciletas.Count());

                }

                if (contexto.EstacionBiciletas.Count() >= parametrosSancion.MaximoBiciletas.Value - parametrosSancion.AdvertenciaBicicletas.Value)
                {
                    var emailSupervisor = new AppSettingsReader().GetValue("MailSupervisor", CodigoBicicleta.GetType()).ToString();

                    Comun.enviarCorreo(emailSupervisor, "Estación con Número máximo de Bicicletas", "La estación " + contexto.Estacions.Where(e => e.Id == IdEstacion).FirstOrDefault().Nombre + "está llegando al numero Máximo de biciletas, número actual de bicicletas: " + contexto.EstacionBiciletas.Count());

                }

            }
            return resultado;

        }
        /// <summary>
        /// Proceso de aplicar sanciones 
        /// </summary>
        private void AplicarSancion()
        {

        }
        /// <summary>
        /// Metodo para enviar bicicletas en balanceo de entrega
        /// </summary>
        /// <param name="IdUsuario">Identificador del operador que Entrega bicicletas</param>
        /// <param name="IdEstacion">Identificador de la Estación que Entrega bicicletas</param>
        /// <param name="codigoUsuarioRecibe">Identificador del Operador que Entrega Bicicletas</param>
        /// <param name="bicicletas">Detalles de Bicicletas que Entrega </param>
        /// <returns></returns>
        public Result BalanceoEntrega(Guid IdUsuario, Guid IdEstacion, string  codigoUsuarioRecibe, List<string> bicicletas)
        {

            Result resultado = new Result();
            resultado.estado = true;
     
            using (BiciqContexto contexto = new BiciqContexto())
            {
                List<Bicicleta> listaBicicletas = new List<Bicicleta>();
                foreach (var item in bicicletas)
                {
                    int numero = Convert.ToInt32(item);
                    var bicicleta = contexto.Bicicletas.Where(b => b.Numero == numero).FirstOrDefault();
                    if (bicicleta == null)
                    {
                        resultado.estado = false;
                        resultado.mensaje = "Existe un problema al leer el código de la Bicileta, intente nuevamente";
                        return resultado;
                    }
                    listaBicicletas.Add(bicicleta);

                }

                var usuarioRecibe = contexto.Empleadoes.Where(e => e.Codigo == codigoUsuarioRecibe && e.estado == "ACT").FirstOrDefault();
                if (usuarioRecibe == null)
                {
                    resultado.estado = false;
                    resultado.mensaje = "Existe un problema al leer el código del usuario que recibe las bicicletas, intente nuevamente";
                    return resultado;
                }
              
                Operacion operacion = new Operacion();
                operacion.Id = Guid.NewGuid();
                operacion.Estado = "COM";
                operacion.Fecha = DateTime.Now;
                operacion.IdEstacion = IdEstacion;
                operacion.IdUsuario = IdUsuario;
                operacion.Observaciones = "";
                operacion.IdTipoOperacion = Guid.Parse("97de3a54-bea0-4152-9360-d9f9381a7c19");
                operacion.IdUsuarioAceptaTransaccion = usuarioRecibe.usuario_id;


                foreach (var item in listaBicicletas)
                {
                    var estacionBicicleta = contexto.EstacionBiciletas.Where(e => e.idBicicleta == item.Id && e.IdEstacion == IdEstacion).FirstOrDefault();
                    if (estacionBicicleta == null)
                    {
                        //resultado.estado = false;
                        //resultado.mensaje = "Una bicileta no se encuentra registrada en la estación o no se leyó el código correctamente, intente nuevamente";
                        //return resultado;
                    }
                    else
                    {

                        contexto.EstacionBiciletas.DeleteObject(estacionBicicleta);
                    }
                    DetalleOperacion detalle = new DetalleOperacion();
                    detalle.Id = Guid.NewGuid();
                    detalle.IdBicicleta = item.Id;
                    operacion.DetalleOperacions.Add(detalle);


                    foreach (var bic in contexto.ClienteBicicletas.Where(b => b.Bicicleta.Id == item.Id))
                    {


                        try
                        {

                            var operacionPres = contexto.Operacions.Where(o => o.IdTipoOperacion.Value == Guid.Parse("1c6f54a2-ab24-45aa-bd1c-55e06f26f05e")
                                                                 && o.Estado == "ACT"
                                                                 );
                            foreach (var prestamo in operacionPres)
                            {

                                Operacion operacionDev = new Operacion();
                                operacionDev.Id = Guid.NewGuid();
                                operacionDev.Estado = "COM";
                                operacionDev.Fecha = DateTime.Now;
                                operacionDev.IdEstacion = IdEstacion;
                                operacionDev.IdUsuario = IdUsuario;
                                operacionDev.Observaciones = "";
                                operacionDev.IdTipoOperacion = Guid.Parse("1d13c26b-6185-4656-8bda-a55cfc2ea1d0");

                                operacionDev.IdOperacionFinaliza = prestamo.Id;

                                prestamo.Estado = "COM";

                                contexto.Operacions.AddObject(operacionDev);

                                var historiaCliente = contexto.HistoriaClientes.Where(h => h.IdOperacionPrestamo == prestamo.Id).FirstOrDefault();
                                var historiaBicileta = contexto.HistoriaBicilietas.Where(h => h.IdOperacionPrestamo == prestamo.Id).FirstOrDefault();

                                historiaBicileta.IdOperacionEntrega = operacionDev.Id;
                                historiaBicileta.IdEstacionEntrega = IdEstacion;
                                historiaBicileta.HoraEntrega = new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);


                                historiaCliente.IdEstacionEntrega = IdEstacion;
                                historiaCliente.IdOperacionEntrega = operacionDev.Id;
                                historiaCliente.MinutosRecorrido = 40;
                                historiaCliente.MinutosRetraso = 0;

                            }
                        }
                        catch (Exception)
                        {


                        }

                        contexto.ClienteBicicletas.DeleteObject(bic);
                    } 
                }
             

                contexto.Operacions.AddObject(operacion);
                contexto.SaveChanges();

                resultado.mensaje = "Entrega de Biciletas realizada con éxito, se han entregado " + listaBicicletas.Count() + " a " + usuarioRecibe.nombresApellidos;
                resultado.Objeto1 = contexto.EstacionBiciletas.Where(e => e.Id == IdEstacion).Count();


                var parametrosSancion = contexto.ParametrosSanciones.FirstOrDefault();
                if (contexto.EstacionBiciletas.Count() <= parametrosSancion.MinimoBicicletas.Value + parametrosSancion.AdvertenciaBicicletas.Value)
                {
                    var emailSupervisor = new AppSettingsReader().GetValue("MailSupervisor", codigoUsuarioRecibe.GetType()).ToString();

                    Comun.enviarCorreo(emailSupervisor, "Estación con Número mínimo de Bicicletas", "La estación " + contexto.Estacions.Where(e => e.Id == IdEstacion).FirstOrDefault().Nombre + "está llegando al numero Mínimo de biciletas, número actual de bicicletas: " + contexto.EstacionBiciletas.Count());

                }

                if (contexto.EstacionBiciletas.Count() >= parametrosSancion.MaximoBiciletas.Value - parametrosSancion.AdvertenciaBicicletas.Value)
                {
                    var emailSupervisor = new AppSettingsReader().GetValue("MailSupervisor", codigoUsuarioRecibe.GetType()).ToString();

                    Comun.enviarCorreo(emailSupervisor, "Estación con Número máximo de Bicicletas", "La estación " + contexto.Estacions.Where(e => e.Id == IdEstacion).FirstOrDefault().Nombre + "está llegando al numero Máximo de biciletas, número actual de bicicletas: " + contexto.EstacionBiciletas.Count());

                }
            }
            
            
            return resultado;
        }

        /// <summary>
        /// Metodo utilizado por el Dispositivo Mobil para recibir la Bicicletas en Estación 
        /// </summary>
        /// <param name="IdUsuario">Identificador del Operador que Recibe Bicicletas</param>
        /// <param name="IdEstacion">Identificador de la Estación que Recibe Bicicletas</param>
        /// <param name="codigoUsuarioEntrega">Codigo del Operador que Recibe Bicicletas</param>
        /// <param name="bicicletas">Detalle de bicicletas que se Recibe</param>
        /// <returns></returns>
        public Result BalanceoRecepcion(Guid IdUsuario, Guid IdEstacion, string codigoUsuarioEntrega, List<string> bicicletas)
        {


            Result resultado = new Result();
            resultado.estado = true;

            using (BiciqContexto contexto = new BiciqContexto())
            {
                List<Bicicleta> listaBicicletas = new List<Bicicleta>();
                foreach (var item in bicicletas)
                {
                    int numero = Convert.ToInt32(item);
                    var bicicleta = contexto.Bicicletas.Where(b => b.Numero == numero).FirstOrDefault();
                    if (bicicleta == null)
                    {
                        resultado.estado = false;
                        resultado.mensaje = "Existe un problema al leer el código de la Bicileta, intente nuevamente";
                        return resultado;
                    }
                    listaBicicletas.Add(bicicleta);

                }

                var usuarioEntrega= contexto.Empleadoes.Where(e => e.Codigo == codigoUsuarioEntrega && e.estado == "ACT").FirstOrDefault();
                if (usuarioEntrega == null)
                {
                    resultado.estado = false;
                    resultado.mensaje = "Existe un problema al leer el código del usuario que entrega las bicicletas, intente nuevamente";
                    return resultado;
                }

                Operacion operacion = new Operacion();
                operacion.Id = Guid.NewGuid();
                operacion.Estado = "COM";
                operacion.Fecha = DateTime.Now;
                operacion.IdEstacion = IdEstacion;
                operacion.IdUsuario = IdUsuario;
                operacion.Observaciones = "";
                operacion.IdTipoOperacion = Guid.Parse("9817bcca-fef6-4795-8d50-0a411cc701af");
                operacion.IdUsuarioAceptaTransaccion = usuarioEntrega.usuario_id;


                foreach (var item in listaBicicletas)
                {
                    EstacionBicileta estacionBicicleta = new EstacionBicileta();
                    estacionBicicleta.Id = Guid.NewGuid();
                    estacionBicicleta.idBicicleta = item.Id;
                    estacionBicicleta.IdEstacion = IdEstacion;

                    contexto.EstacionBiciletas.AddObject(estacionBicicleta);
                   

                    DetalleOperacion detalle = new DetalleOperacion();
                    detalle.Id = Guid.NewGuid();
                    detalle.IdBicicleta = item.Id;
                    operacion.DetalleOperacions.Add(detalle);

                    foreach (var bic in contexto.ClienteBicicletas.Where(b => b.Bicicleta.Id == item.Id))
                    {


                        try
                        {

                            var operacionPres = contexto.Operacions.Where(o => o.IdTipoOperacion.Value == Guid.Parse("1c6f54a2-ab24-45aa-bd1c-55e06f26f05e")
                                                                 && o.Estado == "ACT"
                                                                 );
                            foreach (var prestamo in operacionPres)
                            {

                                Operacion operacionDev = new Operacion();
                                operacionDev.Id = Guid.NewGuid();
                                operacionDev.Estado = "COM";
                                operacionDev.Fecha = DateTime.Now;
                                operacionDev.IdEstacion = IdEstacion;
                                operacionDev.IdUsuario = IdUsuario;
                                operacionDev.Observaciones = "";
                                operacionDev.IdTipoOperacion = Guid.Parse("1d13c26b-6185-4656-8bda-a55cfc2ea1d0");

                                operacionDev.IdOperacionFinaliza = prestamo.Id;

                                prestamo.Estado = "COM";

                                contexto.Operacions.AddObject(operacionDev);

                                var historiaCliente = contexto.HistoriaClientes.Where(h => h.IdOperacionPrestamo == prestamo.Id).FirstOrDefault();
                                var historiaBicileta = contexto.HistoriaBicilietas.Where(h => h.IdOperacionPrestamo == prestamo.Id).FirstOrDefault();

                                historiaBicileta.IdOperacionEntrega = operacionDev.Id;
                                historiaBicileta.IdEstacionEntrega = IdEstacion;
                                historiaBicileta.HoraEntrega = new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);


                                historiaCliente.IdEstacionEntrega = IdEstacion;
                                historiaCliente.IdOperacionEntrega = operacionDev.Id;
                                historiaCliente.MinutosRecorrido = 40;
                                historiaCliente.MinutosRetraso = 0;

                            }
                        }
                        catch (Exception)
                        {


                        }

                        contexto.ClienteBicicletas.DeleteObject(bic);
                    } 
                }


                contexto.Operacions.AddObject(operacion);

                resultado.mensaje = "Recepción de Biciletas realizada con éxito, se han recibido " + listaBicicletas.Count() + " de  Dario Chuquilla";
                resultado.Objeto1 = contexto.EstacionBiciletas.Where(e => e.Id == IdEstacion).Count();



                var parametrosSancion = contexto.ParametrosSanciones.FirstOrDefault();
                if (contexto.EstacionBiciletas.Count() <= parametrosSancion.MinimoBicicletas.Value + parametrosSancion.AdvertenciaBicicletas.Value)
                {
                    var emailSupervisor = new AppSettingsReader().GetValue("MailSupervisor", codigoUsuarioEntrega.GetType()).ToString();

                    Comun.enviarCorreo(emailSupervisor, "Estación con Número mínimo de Bicicletas", "La estación " + contexto.Estacions.Where(e => e.Id == IdEstacion).FirstOrDefault().Nombre + "está llegando al numero Mínimo de biciletas, número actual de bicicletas: " + contexto.EstacionBiciletas.Count());

                }

                if (contexto.EstacionBiciletas.Count() >= parametrosSancion.MaximoBiciletas.Value - parametrosSancion.AdvertenciaBicicletas.Value)
                {
                    var emailSupervisor = new AppSettingsReader().GetValue("MailSupervisor", codigoUsuarioEntrega.GetType()).ToString();

                    Comun.enviarCorreo(emailSupervisor, "Estación con Número máximo de Bicicletas", "La estación " + contexto.Estacions.Where(e => e.Id == IdEstacion).FirstOrDefault().Nombre + "está llegando al numero Máximo de biciletas, número actual de bicicletas: " + contexto.EstacionBiciletas.Count());

                }

                contexto.SaveChanges();

             
            }


            return resultado;
        }

        /// <summary>
        /// Metodo para enviar bicicletas en balanceo de entrega
        /// </summary>
        /// <param name="IdUsuario">Identificador del operador que Entrega bicicletas</param>
        /// <param name="IdEstacion">Identificador de la Estación que Entrega bicicletas</param>
        /// <param name="codigoUsuarioRecibe">Identificador del Operador que Entrega Bicicletas</param>
        /// <param name="bicicletas">Detalles de Bicicletas que Entrega </param>
        /// <returns></returns>
        public Result BalanceoEntregar(Guid IdUsuario, Guid IdEstacion, List<string> bicicletas)
        {
            Result resultado = new Result();
            resultado.estado = true;

             using (BiciqContexto contexto = new BiciqContexto())
            {
                List<Bicicleta> listaBicicletas = new List<Bicicleta>();
                foreach (var item in bicicletas)
                {
                    int numero = Convert.ToInt32(item);
                    var bicicleta = contexto.Bicicletas.Where(b => b.Numero == numero).FirstOrDefault();
                    if (bicicleta == null)
                    {
                        resultado.estado = false;
                        resultado.mensaje = "Existe un problema al leer el código de la Bicileta, intente nuevamente";
                        return resultado;
                    }
                    listaBicicletas.Add(bicicleta);

                }

                //var usuarioRecibe = contexto.Empleadoes.Where(e => e.Codigo == codigoUsuarioRecibe && e.estado == "ACT").FirstOrDefault();
                //if (usuarioRecibe == null)
                //{
                //    resultado.estado = false;
                //    resultado.mensaje = "Existe un problema al leer el código del usuario que recibe las bicicletas, intente nuevamente";
                //    return resultado;
                //}
              
                Operacion operacion = new Operacion();
                operacion.Id = Guid.NewGuid();
                operacion.Estado = "COM";
                operacion.Fecha = DateTime.Now;
                operacion.IdEstacion = IdEstacion;
                operacion.IdUsuario = IdUsuario;
                operacion.Observaciones = "";
                operacion.IdTipoOperacion = Guid.Parse("97de3a54-bea0-4152-9360-d9f9381a7c19");
               // operacion.IdUsuarioAceptaTransaccion = usuarioRecibe.usuario_id;


                foreach (var item in listaBicicletas)
                {
                    var estacionBicicleta = contexto.EstacionBiciletas.Where(e => e.idBicicleta == item.Id && e.IdEstacion == IdEstacion).FirstOrDefault();
                    if (estacionBicicleta == null)
                    {
                        //resultado.estado = false;
                        //resultado.mensaje = "Una bicileta no se encuentra registrada en la estación o no se leyó el código correctamente, intente nuevamente";
                        //return resultado;
                    }
                    else
                    {

                        contexto.EstacionBiciletas.DeleteObject(estacionBicicleta);
                    }
                    DetalleOperacion detalle = new DetalleOperacion();
                    detalle.Id = Guid.NewGuid();
                    detalle.IdBicicleta = item.Id;
                    operacion.DetalleOperacions.Add(detalle);

                    foreach (var bic in contexto.ClienteBicicletas.Where(b => b.Bicicleta.Id == item.Id))
                    {


                        try
                        {

                            var operacionPres = contexto.Operacions.Where(o => o.IdTipoOperacion.Value == Guid.Parse("1c6f54a2-ab24-45aa-bd1c-55e06f26f05e")
                                                                 && o.Estado == "ACT"
                                                                 );
                            foreach (var prestamo in operacionPres)
                            {

                                Operacion operacionDev = new Operacion();
                                operacionDev.Id = Guid.NewGuid();
                                operacionDev.Estado = "COM";
                                operacionDev.Fecha = DateTime.Now;
                                operacionDev.IdEstacion = IdEstacion;
                                operacionDev.IdUsuario = IdUsuario;
                                operacionDev.Observaciones = "";
                                operacionDev.IdTipoOperacion = Guid.Parse("1d13c26b-6185-4656-8bda-a55cfc2ea1d0");

                                operacionDev.IdOperacionFinaliza = prestamo.Id;

                                prestamo.Estado = "COM";

                                contexto.Operacions.AddObject(operacionDev);

                                var historiaCliente = contexto.HistoriaClientes.Where(h => h.IdOperacionPrestamo == prestamo.Id).FirstOrDefault();
                                var historiaBicileta = contexto.HistoriaBicilietas.Where(h => h.IdOperacionPrestamo == prestamo.Id).FirstOrDefault();

                                historiaBicileta.IdOperacionEntrega = operacionDev.Id;
                                historiaBicileta.IdEstacionEntrega = IdEstacion;
                                historiaBicileta.HoraEntrega = new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);


                                historiaCliente.IdEstacionEntrega = IdEstacion;
                                historiaCliente.IdOperacionEntrega = operacionDev.Id;
                                historiaCliente.MinutosRecorrido = 40;
                                historiaCliente.MinutosRetraso = 0;

                            }
                        }
                        catch (Exception)
                        {


                        }

                        contexto.ClienteBicicletas.DeleteObject(bic);
                    } 
                }
             

                contexto.Operacions.AddObject(operacion);
                contexto.SaveChanges();

                resultado.mensaje = "Entrega de Biciletas realizada con éxito, se han entregado " + listaBicicletas.Count() ;
                resultado.Objeto1 = contexto.EstacionBiciletas.Where(e => e.Id == IdEstacion).Count();

                string tipo = "";

                var parametrosSancion = contexto.ParametrosSanciones.FirstOrDefault();
                if (contexto.EstacionBiciletas.Count() <= parametrosSancion.MinimoBicicletas.Value + parametrosSancion.AdvertenciaBicicletas.Value)
                {
                    var emailSupervisor = new AppSettingsReader().GetValue("MailSupervisor", tipo.GetType()).ToString();

                    Comun.enviarCorreo(emailSupervisor, "Estación con Número mínimo de Bicicletas", "La estación " + contexto.Estacions.Where(e => e.Id == IdEstacion).FirstOrDefault().Nombre + "está llegando al numero Mínimo de biciletas, número actual de bicicletas: " + contexto.EstacionBiciletas.Count());

                }

                if (contexto.EstacionBiciletas.Count() >= parametrosSancion.MaximoBiciletas.Value - parametrosSancion.AdvertenciaBicicletas.Value)
                {
                    var emailSupervisor = new AppSettingsReader().GetValue("MailSupervisor", tipo.GetType()).ToString();

                    Comun.enviarCorreo(emailSupervisor, "Estación con Número máximo de Bicicletas", "La estación " + contexto.Estacions.Where(e => e.Id == IdEstacion).FirstOrDefault().Nombre + "está llegando al numero Máximo de biciletas, número actual de bicicletas: " + contexto.EstacionBiciletas.Count());

                }
            }
            
            
            return resultado;
     
        }

        /// <summary>
        /// Metodo de recepción que realiza la recepción de bicicletas
        /// </summary>
        /// <param name="IdUsuario">Identificador del Operador que Recibe Bicicletas</param>
        /// <param name="IdEstacion">Identificador de la Estación que Recibe Bicicletas</param>
        /// <param name="codigoUsuarioEntrega">Codigo del Operador que Recibe Bicicletas</param>
        /// <param name="bicicletas">Detalle de bicicletas que se Recibe</param>
        /// <returns></returns>
        public Result BalanceoRecibir(Guid IdUsuario, Guid IdEstacion, List<string> bicicletas)
        {
            Result resultado = new Result();
            resultado.estado = true;


            using (BiciqContexto contexto = new BiciqContexto())
            {
                List<Bicicleta> listaBicicletas = new List<Bicicleta>();
                foreach (var item in bicicletas)
                {
                    int numero = Convert.ToInt32(item);
                    var bicicleta = contexto.Bicicletas.Where(b => b.Numero == numero).FirstOrDefault();
                    if (bicicleta == null)
                    {
                        resultado.estado = false;
                        resultado.mensaje = "Existe un problema al leer el código de la Bicileta, intente nuevamente";
                        return resultado;
                    }
                    listaBicicletas.Add(bicicleta);

                }

                //var usuarioEntrega = contexto.Empleadoes.Where(e => e.Codigo == codigoUsuarioEntrega && e.estado == "ACT").FirstOrDefault();
                //if (usuarioEntrega == null)
                //{
                //    resultado.estado = false;
                //    resultado.mensaje = "Existe un problema al leer el código del usuario que entrega las bicicletas, intente nuevamente";
                //    return resultado;
                //}

                Operacion operacion = new Operacion();
                operacion.Id = Guid.NewGuid();
                operacion.Estado = "COM";
                operacion.Fecha = DateTime.Now;
                operacion.IdEstacion = IdEstacion;
                operacion.IdUsuario = IdUsuario;
                operacion.Observaciones = "";
                operacion.IdTipoOperacion = Guid.Parse("9817bcca-fef6-4795-8d50-0a411cc701af");
                //operacion.IdUsuarioAceptaTransaccion = usuarioEntrega.usuario_id;


                foreach (var item in listaBicicletas)
                {
                    EstacionBicileta estacionBicicleta = new EstacionBicileta();
                    estacionBicicleta.Id = Guid.NewGuid();
                    estacionBicicleta.idBicicleta = item.Id;
                    estacionBicicleta.IdEstacion = IdEstacion;

                    contexto.EstacionBiciletas.AddObject(estacionBicicleta);


                    DetalleOperacion detalle = new DetalleOperacion();
                    detalle.Id = Guid.NewGuid();
                    detalle.IdBicicleta = item.Id;
                    operacion.DetalleOperacions.Add(detalle);

                    foreach (var bic in contexto.ClienteBicicletas.Where(b => b.Bicicleta.Id == item.Id))
                    {


                        try
                        {

                            var operacionPres = contexto.Operacions.Where(o => o.IdTipoOperacion.Value == Guid.Parse("1c6f54a2-ab24-45aa-bd1c-55e06f26f05e")
                                                                 && o.Estado == "ACT"
                                                                 );
                            foreach (var prestamo in operacionPres)
                            {

                                Operacion operacionDev = new Operacion();
                                operacionDev.Id = Guid.NewGuid();
                                operacionDev.Estado = "COM";
                                operacionDev.Fecha = DateTime.Now;
                                operacionDev.IdEstacion = IdEstacion;
                                operacionDev.IdUsuario = IdUsuario;
                                operacionDev.Observaciones = "";
                                operacionDev.IdTipoOperacion = Guid.Parse("1d13c26b-6185-4656-8bda-a55cfc2ea1d0");

                                operacionDev.IdOperacionFinaliza = prestamo.Id;

                                prestamo.Estado = "COM";

                                contexto.Operacions.AddObject(operacionDev);

                                var historiaCliente = contexto.HistoriaClientes.Where(h => h.IdOperacionPrestamo == prestamo.Id).FirstOrDefault();
                                var historiaBicileta = contexto.HistoriaBicilietas.Where(h => h.IdOperacionPrestamo == prestamo.Id).FirstOrDefault();

                                historiaBicileta.IdOperacionEntrega = operacionDev.Id;
                                historiaBicileta.IdEstacionEntrega = IdEstacion;
                                historiaBicileta.HoraEntrega = new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);


                                historiaCliente.IdEstacionEntrega = IdEstacion;
                                historiaCliente.IdOperacionEntrega = operacionDev.Id;
                                historiaCliente.MinutosRecorrido = 40;
                                historiaCliente.MinutosRetraso = 0;

                            }
                        }
                        catch (Exception)
                        {


                        }

                        contexto.ClienteBicicletas.DeleteObject(bic);
                    } 
                }


                contexto.Operacions.AddObject(operacion);

                resultado.mensaje = "Recepción de Biciletas realizada con éxito, se han recibido " + listaBicicletas.Count() ;
                resultado.Objeto1 = contexto.EstacionBiciletas.Where(e => e.Id == IdEstacion).Count();


                string tipo = "";
                var parametrosSancion = contexto.ParametrosSanciones.FirstOrDefault();
                if (contexto.EstacionBiciletas.Count() <= parametrosSancion.MinimoBicicletas.Value + parametrosSancion.AdvertenciaBicicletas.Value)
                {
                    var emailSupervisor = new AppSettingsReader().GetValue("MailSupervisor", tipo.GetType()).ToString();

                    Comun.enviarCorreo(emailSupervisor, "Estación con Número mínimo de Bicicletas", "La estación " + contexto.Estacions.Where(e => e.Id == IdEstacion).FirstOrDefault().Nombre + "está llegando al numero Mínimo de biciletas, número actual de bicicletas: " + contexto.EstacionBiciletas.Count());

                }

                if (contexto.EstacionBiciletas.Count() >= parametrosSancion.MaximoBiciletas.Value - parametrosSancion.AdvertenciaBicicletas.Value)
                {
                    var emailSupervisor = new AppSettingsReader().GetValue("MailSupervisor", tipo.GetType()).ToString();

                    Comun.enviarCorreo(emailSupervisor, "Estación con Número máximo de Bicicletas", "La estación " + contexto.Estacions.Where(e => e.Id == IdEstacion).FirstOrDefault().Nombre + "está llegando al numero Máximo de biciletas, número actual de bicicletas: " + contexto.EstacionBiciletas.Count());

                }

                contexto.SaveChanges();


            }


            return resultado;
        }
        /// <summary>
        /// Metodo utilizado como informativo de personas no Atendidas
        /// </summary>
        /// <param name="IdUsuario">Identificador del operador de Estación</param>
        /// <param name="IdEstacion">Identificador de la Estación</param>
        /// <param name="cliente">Cliente no Atendido </param>
        /// <param name="observacion">Detalle de la persona no atendida</param>
        /// <returns></returns>
        public Result PersonsNoAtendidas(Guid IdUsuario, Guid IdEstacion, string cliente, string observacion)
        {

            Result resultado = new Result();
            resultado.estado = true;
            
             using (BiciqContexto contexto = new BiciqContexto())
            {
                var clienteNoAtendido = contexto.Clientes
                    .Include("ClienteBicicletas")
                    .Where(b => b.Tarjeta.codigo == cliente).FirstOrDefault();
                
                if (clienteNoAtendido == null)
                {
                    resultado.estado = false;
                    resultado.mensaje = "Existe un problema al leer el código del Cliente, intente nuevamente";
                    return resultado;
                }

                Operacion operacion = new Operacion();
                operacion.Id = Guid.NewGuid();
                operacion.Estado = "ACT";
                operacion.Fecha = DateTime.Now;
                operacion.IdEstacion = IdEstacion;
                operacion.IdUsuario = IdUsuario;
                operacion.Observaciones = observacion;
                operacion.IdTipoOperacion = Guid.Parse("b2e0bb2b-a31c-4207-b2ef-e21697d2daeb");
                operacion.IdCliente = clienteNoAtendido.Id;

                resultado.mensaje = "Se ha registrado el Reclamo del Cliente " + clienteNoAtendido.NombresApellidos + "al no se atendido";
                

            }
          

            

            return resultado;
        }
        /// <summary>
        /// Metodo hacer utilizado por el dispositivo Mobil para realizar cierra de la Estación.
        /// </summary>
        /// <param name="IdUsuario">Identificador del Operador de Estación </param>
        /// <param name="IdEstacion">Identificador de la Estación</param>
        /// <param name="bicicletas">Detalle Bicicletas del Cierre de Estación</param>
        /// <param name="observacion1">Detalle descrito por el Operador de Estación</param>
        /// <returns></returns>
        public Result CierreDia(Guid IdUsuario, Guid IdEstacion, List<string> bicicletas, string observacion1)
        {

            Result resultado = new Result();
            resultado.estado = true;
            resultado.mensaje = "Ok";

            try
            {
                using (BiciqContexto contexto = new BiciqContexto())
                {

                    Operacion operacion = new Operacion();
                    operacion.Id = Guid.NewGuid();
                    operacion.Estado = "ACT";
                    operacion.Fecha = DateTime.Now;
                    operacion.IdEstacion = IdEstacion;
                    operacion.IdUsuario = IdUsuario;
                    operacion.Observaciones = observacion1;
                    operacion.IdTipoOperacion = Guid.Parse("99dc793c-b558-4a63-8bfc-197b16aa39ff");


                    var numeroBiciclestasActual = contexto.EstacionBiciletas.Where(eb => eb.IdEstacion == IdEstacion).Count();
                    if (numeroBiciclestasActual != bicicletas.Count)
                    {
                        operacion.Observaciones = operacion.Observaciones + ". El Sistema detecta que hay un número diferente de bicicletas que en el día anterior. Ayer: " + numeroBiciclestasActual + " Hoy: " + bicicletas.Count;
                        //TODO 
                        //Enviar Correo de notificación de diferencias.

                    }
                    foreach (var item in contexto.EstacionBiciletas.Where(eb=>eb.IdEstacion == IdEstacion))
                    {
                        contexto.DeleteObject(item);
                    }

                    foreach (var item in bicicletas)
                    {
                        int numero = Convert.ToInt32(item);
                        var bicicleta = contexto.Bicicletas.Where(b => b.Numero == numero).FirstOrDefault();

                        if (bicicleta == null)
                        {
                            resultado.estado = false;
                            resultado.mensaje = "Existe un problema al leer el código de la Bicileta, intente nuevamente";
                            return resultado;
                        }
                            DetalleOperacion detalle = new DetalleOperacion();
                            detalle.Id = Guid.NewGuid();
                            detalle.IdBicicleta = bicicleta.Id;
                            operacion.DetalleOperacions.Add(detalle);

                            EstacionBicileta estacionBicicleta = new EstacionBicileta();

                            estacionBicicleta.Id = Guid.NewGuid();
                            estacionBicicleta.idBicicleta = bicicleta.Id;
                            estacionBicicleta.IdEstacion = IdEstacion;

                            contexto.EstacionBiciletas.AddObject(estacionBicicleta);


                            foreach (var bic in contexto.ClienteBicicletas.Where(b => b.Bicicleta.Id == bicicleta.Id))
                            {


                                try
                                {

                                    var operacionPres = contexto.Operacions.Where(o => o.IdTipoOperacion.Value == Guid.Parse("1c6f54a2-ab24-45aa-bd1c-55e06f26f05e")
                                                                         && o.Estado == "ACT"
                                                                         );
                                    foreach (var prestamo in operacionPres)
                                    {

                                        Operacion operacionDev = new Operacion();
                                        operacionDev.Id = Guid.NewGuid();
                                        operacionDev.Estado = "COM";
                                        operacionDev.Fecha = prestamo.Fecha.Value.AddMinutes(40);
                                        operacionDev.IdEstacion = IdEstacion;
                                        operacionDev.IdUsuario = IdUsuario;
                                        operacionDev.Observaciones = "";
                                        operacionDev.IdTipoOperacion = Guid.Parse("1d13c26b-6185-4656-8bda-a55cfc2ea1d0");

                                        operacionDev.IdOperacionFinaliza = prestamo.Id;

                                        prestamo.Estado = "COM";

                                        contexto.Operacions.AddObject(operacionDev);

                                        var historiaClienteP = contexto.HistoriaClientes.Where(h => h.IdOperacionPrestamo == prestamo.Id).FirstOrDefault();
                                        var historiaBiciletaP = contexto.HistoriaBicilietas.Where(h => h.IdOperacionPrestamo == prestamo.Id).FirstOrDefault();

                                        if (historiaClienteP != null)
                                        {
                                            historiaBiciletaP.IdOperacionEntrega = operacionDev.Id;
                                            historiaBiciletaP.IdEstacionEntrega = IdEstacion;
                                            
                                            historiaBiciletaP.HoraEntrega = new TimeSpan(operacionDev.Fecha.Value.Hour, operacionDev.Fecha.Value.Minute, operacionDev.Fecha.Value.Second);
                                        }

                                        if (historiaBiciletaP != null)
                                        {
                                            historiaClienteP.IdEstacionEntrega = IdEstacion;
                                            historiaClienteP.IdOperacionEntrega = operacionDev.Id;
                                            historiaClienteP.MinutosRecorrido = 40;
                                            historiaClienteP.MinutosRetraso = 0;
                                            historiaClienteP.HoraEntrega = new TimeSpan(operacionDev.Fecha.Value.Hour, operacionDev.Fecha.Value.Minute, operacionDev.Fecha.Value.Second);
                                        }

                                    }
                                }
                                catch (Exception)
                                {


                                }

                                contexto.ClienteBicicletas.DeleteObject(bic);
                            } 

                    }
                    
                    contexto.Operacions.AddObject(operacion);

                    contexto.SaveChanges();
                    resultado.mensaje = "Se ha registrado el Cierre de día conrrectamente con " + bicicletas.Count.ToString() + " registradas";
                    resultado.Objeto1 = contexto.EstacionBiciletas.Where(e => e.Id == IdEstacion).Count();
                }

            }
            catch (Exception)
            {

                resultado.estado = false;
                resultado.mensaje = "Un error a ocurrido al Inicializar Operación";
            }
            return resultado;
        }
        /// <summary>
        /// Metodo utilizado por el Dispositivo Mobil para verificar la Cantidad de Bicicletas Disponibles en Estación
        /// </summary>
        /// <param name="idEstacion">Identificador de Estación</param>
        /// <returns></returns>
        public List<Bicicleta> ObtenerBicicletas(Guid idEstacion)
        {
            using (BiciqContexto contexto = new BiciqContexto())
            {
                var bicicletas =(from b in contexto.Bicicletas
                                 join e in contexto.EstacionBiciletas on b.Id equals e.idBicicleta
                                 where e.IdEstacion.Value == idEstacion
                                 select b).OrderBy(b=>b.Numero).ToList();
                
                return bicicletas;
            }
        }
        /// <summary>
        /// Metodo utilizado por el Dispositivo Mobil para salir de la Aplicación
        /// </summary>
        /// <param name="IdUsuario">Identificador del Operador de Estación</param>
        /// <param name="IdEstacion">Identificador de la Estación</param>
        /// <returns></returns>
        public Result SalirAplicacion(Guid IdUsuario, Guid IdEstacion)
        {
            Result resultado = new Result();
            resultado.mensaje = "Ok";
            resultado.estado = true;
            using (BiciqContexto contexto = new BiciqContexto())
            {
                var accesos = contexto.AccesoEstacions.Where(a => a.IdEstacion == IdEstacion && a.IdUsuario == IdUsuario && a.FechaSalida == null);

                foreach (var item in accesos)
                {
                    item.FechaSalida = DateTime.Now;
                }
                contexto.SaveChanges();
            }

            return resultado;



        }

        public List<Estacion> ConultarEstaciones()
        {
            using (BiciqContexto contexto = new BiciqContexto())
            {
                return contexto.Estacions.ToList();
            }
        }
    }
}
